<?php
 /**
 +------------------------------------------------------------------------------
 * cache class for ephp
 +------------------------------------------------------------------------------
 * @Version  3.0
 * @Author   WangXian
 * @E-mail    admin@loopx.cn
 * @package  ephp
 * @Creation  date 2011-1-10 下午02:42:45
 * @Modified  date 2011-1-10 下午02:42:45
 +------------------------------------------------------------------------------
 */
class Cache
{
	static $instance;
	public $cache,$expire=0; //0,长期有效。
	public static function init()
	{
        if (!isset(self::$instance))
        {
        	self::$instance = new self();
        	
        	// 使用哪种方式的cache
        	$cache_driver = C('cache_type') ? C('cache_type').'X' : 'FileCacheX';
        	self::$instance->cache = new $cache_driver;
        }
        return self::$instance;
	}
	
	/** 获取缓存。 **/
	function __get($key)
	{
		return $this->get($key);
	}
	
	/** 设置缓存。 **/
	function __set($key,$value)
	{
		return $this->set($key,$value);
	}
	
	/**
	 * 获取缓存
	 * @param string $key
	 */
	public function get($key)
	{
		return $this->cache->get($key);
	}
	
	/**
	 * 设置缓存
	 * @param string $key
	 * @param mixed $value
	 * @param integer $expire 有效期，0,长期有效。
	 */
	public function set($key, $value, $expire=0)
	{
		if( $this->expire ) $expire=$this->expire;
		return $this->cache->set($key,$value,$expire);
	}
	
	/**
	 * 删除缓存
	 * @param string $key
	 */
	public function delete($key)
	{
		return $this->cache->delete($key);
	}
	
	/** 清理所有缓存。 **/
	public function flush()
	{
//		if( C('cache_type') == 'MemCacheX')
//		{
			return $this->cache->flush();
//		}
//		else exit('Only MemCacheX driver can use flush method.');
	}
}

//---------------------------------------------------FileCacheX 类封装
class FileCacheX
{
	/**
	 * 获取缓存
	 * @param string $key
	 */
	public function get($key)
	{
		$filename = $this->_filename($key);
		if( ! file_exists($filename) ) return false;
		
		$tmp_value = file_get_contents( $filename );
		$expire = (int)substr($tmp_value,13,24);
		
//		echo time()."<br />\n";
//		echo $expire."<br />\n";
//		echo substr($tmp_value,23);exit;
		
		if($expire != 0 && time() < $expire)
		{
			return unserialize( substr($tmp_value,23) );
		}
		else return false;
	}
	
	/**
	 * 设置缓存
	 * @param string $key
	 * @param mixed $value
	 * @param integer $expire 有效期，0,长期有效。
	 */
	public function set($key, $value, $expire=0)
	{
		if( $expire != 0) $expire = time() + $expire;
		else $expire = time() * 2; //如果expire为0时，设为长期有效。
		
		$value = '<?php exit;?>'. $expire . serialize($value);
		return file_put_contents($this->_filename($key), $value);
	}
	
	/**
	 * 删除缓存
	 * @param string $key
	 */
	public function delete($key)
	{
		return unlink( $this->_filename($key) );
	}
	
	/** 清理所有的缓存。 **/
	public function flush($dir='')
	{
		$dir = APP_PATH.'/runtime/cache/';
		Dir::deleteDir($dir);
		mkdir($dir,0777);
	}
	
	/** 计算缓存名称。 **/
	private function _filename($key)
	{
		if(true == ( $dir_pos = strrpos($key ,'/') ) )
		{//有子目录，也可能有多层子目录。
			
			$cache_name = substr($key,$dir_pos+1);
			
			//缓存目录
			$cache_dir = APP_PATH.'/runtime/cache/'.substr($key, 0, $dir_pos) . '/';
			if( ! is_dir($cache_dir)) mkdir($cache_dir,0777,TRUE);//递归创建文件夹
		}
		else
		{//无子目录
			$cache_name = $key;
			$cache_dir=APP_PATH.'/runtime/cache/';//缓存名称
		}
		
		#缓存文件名
		return $cache_dir . trim($cache_name) .'^'. md5($cache_name) .'.php';
	}
}

//---------------------------------------------------MemCacheX 类封装
class MemCacheX
{

/**
如果选择了，memcache缓存驱动，则需要在APP_PATH.'/conf/memcache.config.php'中配置memcache server信息。
配置格式如：
_app/conf/memcache.config.php
return array(
	array('host'=>'192.168.0.102','port'=>11211,'weight'=>3),
	array('host'=>'192.168.0.103','port'=>11211,'weight'=>3),
	array('host'=>'192.168.0.106','port'=>11211,'weight'=>4),
);
*/
	private $connection;
	function __construct()
	{
		$this->connection = new MemCache;
		
		$config = include APP_PATH.'/conf/memcache.config.php';
		foreach ($config as $v)
		{
			$this->addServer($v['host'],$v['port'],$v['weight']);
		}
	}
	
	/**
	 * 写缓存
	 * @param $key 缓存名称
	 * @param $data 缓存内容
	 * @param $expire 缓存有效期，0,长期有效。
	 */
	function set($key,$data,$expire=0)
	{
		return $this->connection->set($key,$data,MEMCACHE_COMPRESSED,$expire);
	}
	
	/**
	 * 取缓存
	 * @param string $key 缓存名称
	 */
	function get($key)
	{
		return $this->connection->get($key);
	}
	
	/**
	 * 立即删除缓存
	 * @param string $key 缓存名称
	 */
	function delete($key)
	{
		return $this->connection->delete($key);
	}
	
	/**
	 * 添加memcache server
	 * @param string $host 主机名成
	 * @param int $port 端口
	 * @param int $weight 权重
	 */
	function addServer($host, $port=11211, $weight=10)
	{
		return $this->connection->addServer($host,$port,true,$weight);
	}
	
	/**
	 * 刷新memcache的缓存，所有的项目
	 */
	public function flush()
	{
		return $this->connection->flush();
	}
	
	function __destruct()
	{
		// 关闭缓存
		$this->connection->close();
	}
}


/* End of file Cache.class.php */
/* Location: ./_framework/libraries/Cache.class.php */